package io.rehuo.modules.app.service.impl;

import io.rehuo.common.exception.RRException;
import io.rehuo.common.utils.CommonUtils;
import io.rehuo.common.utils.RedisUtils;
import io.rehuo.common.utils.StringUtils;
import io.rehuo.common.utils.phone.MobileRegularExp;
import io.rehuo.modules.app.service.CommonService;
import io.rehuo.modules.app.service.SmsTemplateService;
import io.rehuo.modules.app.utils.StrUtils;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Slf4j
@Service("commonService")
public class CommonServiceImpl implements CommonService {

    private Logger logger = LoggerFactory.getLogger(CommonServiceImpl.class);

    @Autowired
    RedisUtils redisUtils;

    @Autowired
    private SmsTemplateService smsTemplateService;

    @Override
    public void getCode(String mobile) {
        if (StringUtils.isEmpty(mobile)) {
            throw new RRException("Số điện thoại di động không phải là trống rỗng");
        }

        if (!mobile.matches("[0-9]+")){
            throw new RRException("Lỗi định dạng số điện thoại");
        }

        if (!(mobile.length() >= 9 && mobile.length() <= 13)){
            throw new RRException("Lỗi định dạng số điện thoại");
        }

        String rCode = redisUtils.get("mobile" + mobile);
        if (StringUtils.isNotBlank(rCode)) {
            throw new RRException("Không lặp lại");
        }

        String code = CommonUtils.getRandomString(6);

        logger.info("验证码为：" + code);
        redisUtils.set("mobile" + mobile, code, 60);

        if (!smsTemplateService.sendSms(StrUtils.checkPhone(mobile), code)) {
            logger.error("验证码发送错误");
            redisUtils.delete("mobile" + mobile);
            throw new RRException("Captcha gửi lỗi");
        }

//        String result = Sms.sendSMS(mobile, code);
//        if (StringUtils.isEmpty(result)){
//            throw new RRException("验证码发送错误");
//        }
//        JSONObject object = JSON.parseObject(result);
//        String s = object.getString("code");
//        if ("0".equals(s)){

        redisUtils.set(mobile, code, 300);
//        }
    }

    protected static boolean isMobileNumber(String nationalCode, String mobileNumber) {
        boolean isMobileNumber = false;
        for (MobileRegularExp regularExp : MobileRegularExp.values()) {
            Pattern pattern = Pattern.compile(regularExp.getRegularExp());
            Matcher matcher = pattern.matcher(new StringBuilder().append(nationalCode).append(mobileNumber).toString());
            if (matcher.matches()) {
                isMobileNumber = true;
                // 枚举中把最常用的国际区号拍在前面可以减少校验开销
                break;
            }
        }
        return isMobileNumber;
    }
}
